﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace TCP_SocketDongbo
{
    class RegistryGrabber:BaseGrabber
    {
        public override void GetNicConfig()
        {
            string networkCardKey = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards";
            string serviceKey = @"SYSTEM\CurrentControlSet\services";
            string networkCardKeyName, serviceName, deviceName, deviceServiceName;

            RegistryKey start = Registry.LocalMachine, cardserviceName, networkKey, serviceNames;
            serviceNames = start.OpenSubKey(networkCardKey);

            if (serviceNames == null)
            {
                Console.WriteLine("Bad Gegistry Key");
                return;
            }

            //lấy các nút con của nút car mạng, mỗi nút tương ứng với một id car mạng

            string[] networkCards = serviceNames.GetSubKeyNames();

            serviceNames.Close();

            // duyệt qua từng nút vừa lấy được
            foreach (var keyname in networkCards)
            { 
                //Tạo đường dẫn tương ứng tới mỗi nút
                networkCardKeyName = string.Format(@"{0}\{1}", networkCardKey, keyname);

                //mở nút lấy từng card mạng với từng đường dẫn tương ứng
                cardserviceName = start.OpenSubKey(networkCardKeyName);

                if (cardserviceName == null)
                {
                    Console.WriteLine("Bad registry Key {0}", cardserviceName);
                    continue;
                }
                //Lấy mã id của card mạng
                deviceServiceName = (string)cardserviceName.GetValue("ServiceName");
                //lấy tên của card mạng
                deviceName = (string)cardserviceName.GetValue("Description");

                //xuất tên card mạng
                Console.WriteLine("Network Card: {0}", deviceName);

                //tạo đường dẫn tới nút chứa cấu hình card mạng
                serviceName = string.Format(@"{0}\{1}\Parameters\Tcpip", serviceKey, deviceServiceName);

                //Mở và lấy thông tin từ nút chứa cấu hình
                networkKey = start.OpenSubKey(serviceName);

                if (networkKey == null)
                {
                    Console.WriteLine("No IP configuration set ");
                }
                else
                { 
                    //Lấy địa chỉ Ip
                    string[] IpAddress = (string[])networkKey.GetValue("IPAddress");
                    //Lấy địa chỉ default gateway
                    string[] defaultgateways = (string[])networkKey.GetValue("DefaultGateway");
                    //Lấy địa chỉ Subnetmask
                    string[] subnetmasks = (string[])networkKey.GetValue("SubnetMask");

                    if (IpAddress == null || defaultgateways == null || subnetmasks == null) continue;
                    //xuất địa chỉ IP của card mạng
                    foreach (var ip in IpAddress)
                    {
                        Console.WriteLine("Ip Address: {0}", ip);
                    }
                    //xuất địa chỉ DefaultGateway
                    foreach (var df in defaultgateways)
                    {
                        Console.WriteLine("DefaultGateway: {0}", df);
                    }
                    //xuất địa chỉ subnet
                    foreach (var su in subnetmasks)
                    {
                        Console.WriteLine("Ip Address: {0}", su);
                    }
                }

            }
            start.Close();

        }
    }
}
